import java.awt.Color
import java.awt.Robot
import java.awt.event.InputEvent

println "===================游戏用户基础信息录入==================="
// 用于校验颜色
def white = new Color(255, 255, 255)
def grey = new Color(89, 88, 89)
def red = new Color(203, 77, 86)
// 1、初始化用户账号信息
def user = [176, 2560, 1600, 1.5,  79, false] as User

// 游戏中的点击按钮位置，统一使用100%的形式，便于不同设备的适配
// 使用双层嵌套 map 存储，按钮名称和对应的鼠标光标
def buttonMap = ["monthlyButton": [x: user.pcLong * 0.5, y: user.pcWidth * 0.85],
                 "agentColorButton": [x: user.pcLong * 0.832, y: user.pcWidth * 0.79375],
                 "monthColorButton": [x: user.pcLong * 0.9453125, y: user.pcWidth * 0.125],
                 "removeMonthlyButton": [x: user.pcLong * 0.95, y: user.pcWidth * 0.125],
                 "infrastructureButton": [x: user.pcLong * 0.8, y: user.pcWidth * 0.84],
                 "infPrizeButton": [x: user.pcLong * 0.95, y: user.pcWidth * 0.156],
                 "infPrizeMenuButton": [x: user.pcLong * 0.2, y: user.pcWidth * 0.9],
                 "exitInfButton": [x: user.pcLong * 0.08, y: user.pcWidth * 0.093],
                 "exitSureButton": [x: user.pcLong * 0.66, y: user.pcWidth * 0.68],
                 "battleButton": [x: user.pcLong * 0.78, y: user.pcWidth * 0.28],
                 "battle1Button": [x: user.pcLong * 0.89, y: user.pcWidth * 0.78],
                 "agentButton": [x: user.pcLong * 0.9, y: user.pcWidth * 0.78],
                 "sixSpeedButton": [x: user.pcLong * 0.78, y: user.pcWidth * 0.7875],
                 "sixSpeed1Button": [x: user.pcLong * 0.78, y: user.pcWidth * 0.3125],
                 "battle2Button": [x: user.pcLong * 0.89, y: user.pcWidth * 0.875],
                 "battle3Button": [x: user.pcLong * 0.86, y: user.pcWidth * 0.75],
                 "homeButton": [x: user.pcLong * 0.2148, y: user.pcWidth * 0.09375],
                 "home1Button": [x: user.pcLong * 0.07, y: user.pcWidth * 0.41],
                 "taskButton": [x: user.pcLong * 0.625, y: user.pcWidth * 0.8125],
                 "gainTaskButton": [x: user.pcLong * 0.89, y: user.pcWidth * 0.21],
                 "weekTaskButton": [x: user.pcLong * 0.664, y: user.pcWidth * 0.093]]

println "===================用户基础操作闭包==================="
// 2、创建机器人对象
def robot = new Robot()
// 3、创建一个随机数对象
def random = new Random()

/**
 * 随机延迟时间函数：模拟人手点击鼠标，防止反脚本检测，例如：0.3 - 0.5s 中间取一个随机数
 */
def delayS = {double beginTime, double endTime -> // 固定计算公式，生成一个 beginTime 到 endTime 的随机数
  double v = beginTime + random.nextDouble() * (endTime-beginTime)
  v = v * 1000
  robot.delay((int)v)
}

/**
 * 鼠标左键一次点击事件，鼠标点击到抬起动作，中间随机 0.3-0.5 s（人类正常手速）
 */
def mousePress = { ->
  // 按下鼠标左键
  robot.mousePress(InputEvent.BUTTON1_DOWN_MASK)
  // 鼠标按下到弹起的时间间隔（随机间隔0.2-0.5s）
  delayS.call(0.2, 0.5)
  // 鼠标左键弹起
  robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK)
}

/**
 * 鼠标点击事件：一次游戏按钮点击事件，鼠标移动并点击，完成后默认间隔1-1.5s
 */
def clickButton = {int x, int y ->
  // 鼠标移动
  robot.mouseMove(x, y)
  delayS.call( 0.2, 0.5)
  // 鼠标左键按下
  mousePress()
  delayS.call( 1, 1.5)
}

println "===================开始自动脚本业务==================="

println "===================基建收菜==================="
// 4、5s钟后开始执行脚本，用户准备时间
robot.delay(5000)
// 5、判断是否需要领取月卡
if (user.monthlyCard){
  // 有月卡，点击领取
  buttonMap['monthlyButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
}
// 6、关闭月历弹窗和活动弹窗
// 判断是否有弹窗
// 获取像素点颜色是否为灰色
Color color;
do{
  // 有弹窗需要关闭
  buttonMap['removeMonthlyButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
  robot.delay(1000)
  // 关闭后，再次检查颜色
  color = buttonMap['monthColorButton']?.with { coords ->
    robot.getPixelColor((int)coords['x'], (int)coords['y'])
  }
}while (isColorSimilar(grey, color))

// 有动画，延迟一下
robot.delay(2000);
// 进入基建界面
buttonMap['infrastructureButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}

// 有动画，延迟一下
robot.delay(3000)

// 判断基站是否有停产的制造站
prizeColor = buttonMap['infPrizeButton']?.with { coords ->
  robot.getPixelColor((int)coords['x'], (int)coords['y'])
}
if (isColorSimilar(red, prizeColor)){
  buttonMap['infPrizeButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y']+100)
  }
}else {
  buttonMap['infPrizeButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
}
// 领五次奖励，制造站、龙门币、信赖、换班、宿舍
5.times {
  buttonMap['infPrizeMenuButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
}

// 退出基站
buttonMap['exitInfButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
// 确认退出基站
buttonMap['exitSureButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
// 有动画，延迟一下
robot.delay(3000);

println "===================挂机速刷战斗==================="

// 6、战斗速刷
// 6-1、进入主线关卡
buttonMap['battleButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}

delayS(1, 1.5)

// 6-2、进入上一次 1-7 战斗
println "===================进入上一次 1-7 战斗==================="
buttonMap['battle1Button']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}

// 6-3、开启6倍速代理
println "===================开启6倍速代理==================="

// 判断代理是否开启，像素点颜色为白
agentColor = buttonMap['agentColorButton']?.with { coords ->
  robot.getPixelColor((int)coords['x'], (int)coords['y'])
}

if (!isColorSimilar(white, agentColor)){
  // 开启代理
  buttonMap['agentButton']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
}

// 选择倍速
buttonMap['sixSpeedButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
// 选择6倍速
buttonMap['sixSpeed1Button']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}

println "===================开始战斗==================="
// 6-4、当前用户 1-7 刷取次数
user17Num = user.get17Num()
// 计算战斗时间
int min = user.getBattleTime() / 60
int sec = user.getBattleTime() % 60

// 循环战斗
user17Num.times {
  // 开始战斗，进入编队前
  buttonMap['battle2Button']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
  // 开始战斗，进入编队
  buttonMap['battle3Button']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y'])
  }
  // 战斗中
  robot.delay(min * 60 * 1000)
  delayS(sec, sec+1)

  // 战斗结束领取奖励 点击任意位置
  buttonMap['battle3Button']?.with { coords ->
    clickButton((int)coords['x'], (int)coords['y']-500)
  }
  // 加载动画延迟
  delayS(4, 5)
}

println "===================领取日/周奖励==================="
// 7、领取日/周奖励
// 7-1、回到主界面
buttonMap['homeButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
buttonMap['home1Button']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
// 7-2、点击任务按钮
buttonMap['taskButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
// 领取日任务
buttonMap['gainTaskButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
robot.delay(1000)
// 领取周任务
buttonMap['weekTaskButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
robot.delay(1000)
buttonMap['weekTaskButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}
buttonMap['gainTaskButton']?.with { coords ->
  clickButton((int)coords['x'], (int)coords['y'])
}

// 颜色相似度判断函数
static boolean isColorSimilar(Color c1, Color c2, int tolerance = 10) {
  Math.abs(c1.red - c2.red) <= tolerance &&
          Math.abs(c1.green - c2.green) <= tolerance &&
          Math.abs(c1.blue - c2.blue) <= tolerance
}